AWS Control TowerのAccount Factory Customization(AFC)を既存アカウントに適用する #reInvent
AWS re:Invent 2022にて Control Tower の AFC(Account Factory Customization)が発表されました。
AWSアカウントを新規作成する際に、Service Catalog製品 (=CloudFormationテンプレート)を選択できます。 選択した製品が新規AWSアカウント作成後に展開されます。 AWSアカウントのベースラインカスタマイズに役立ちます。
今回はAFCを既存アカウント(=AFCを今まで使ってこなかったアカウント)に適用してみます。
※AFCを使うためのセットアップ、および新規アカウント作成時のAFC適用については 前述の アップデートブログ を参照下さい。
前提
今回使うAWSアカウントは以下のとおりです。
- 管理アカウント : Organizations/Control Tower の管理アカウント
- Service Catalog 委任先アカウント : Service Catalog のOrganizations連携 委任先アカウント (= 展開したい製品が格納されているアカウント)
- メンバーアカウント : Control Tower管理下の既存アカウント
Service Catalog 委任先アカウントには展開しようとしている 製品を、事前に作成しています。
また、そのほか Preparation for customization や Set up for customization に記載されている 以下項目はすでに完了しているものとします。
- CloudFormation と Service Catalog のOrganizations連携有効化
- Service Catalog の委任設定
- Service Catalog 委任先アカウントへの必要なIAMロール展開 ※ 「補足」章に実際に使ったテンプレートを記載しています
やってみる
管理アカウントにて既存アカウントのページに移動します。 [アカウントの更新] を選択します。
アクセス設定や組織単位はそのままにして、 [カスタムアカウントファクトリ] 部分を開きます。
AWS Service Catalog の製品を含むアカウント
部分に Service Catalog 委任先アカウントを記入して [アカウントを検証] を選択します。
※ ここで User: arn:aws:sts::...(略) is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::(Service Catalog 委任先アカウント):role/AWSControlTowerBlueprintAccess
といったエラーが出た場合は、事前準備のIAMロール展開に不備がある可能性があります。
製品および製品バージョンを選択します。
デプロイメントリージョンは製品次第ですが、 今回は [すべての管理対象リージョン] としました。
最終的に以下のイメージのようになります。 問題なければ [アカウントの更新] を選択します。
ポップアップの内容を確認して再度 [アカウントの更新] を選択します。
アカウントの状態が 登録中
から 登録済み
となれば完了です。 完了後は ブループリント名
などの情報が記載されていますね。
確認
今回使った製品は「IAMロール 1つのみ」を作成するシンプルなものでした。 それがメンバーアカウントに展開されているか確認します。
メンバーアカウントのIAMコンソールへアクセスします。
以下のように 「Control Tower 管理リージョン」の分だけリソースが 作成されていることを確認できました。
おわりに
既存アカウントへのAFC適用を試してみました。 最初のセットアップは少し手間ですが、それさえ完了すれば 手軽なベースライン作成ツールとして活用できそうです。
以上、参考になれば幸いです。
参考
- Customize accounts with Account Factory Customization (AFC) - AWS Control Tower
- <アップデート>アカウントファクトリーからアカウントをカスタマイズできるAccount Factory Customization (AFC) が追加されました #reInvent | DevelopersIO
補足
検証で使ったService Catalog製品のテンプレート
AWSTemplateFormatVersion: '2010-09-09' Resources: EC2Role: Type: AWS::IAM::Role Properties: RoleName: !Sub "IAMRoleFromAFC-${AWS::Region}" AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: "ec2.amazonaws.com" Action: "sts:AssumeRole" ManagedPolicyArns: - "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
AWSControlTowerBlueprintAccess IAMロール作成で使ったCloudFormationテンプレート
AWSTemplateFormatVersion: "2010-09-09" Description: A sample cloudformation template Resources: SampleIamRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: "Allow" Action: "sts:AssumeRole" Principal: AWS: - "arn:aws:iam::${管理アカウントID}:role/service-role/AWSControlTowerAdmin" - "arn:aws:iam::${管理アカウントID}:role/${管理アカウントにアクセスするロール名}" ManagedPolicyArns: - arn:aws:iam::aws:policy/AWSServiceCatalogAdminFullAccess - arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess RoleName: AWSControlTowerBlueprintAccess